home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / DC_VIEW / DCFILE.C < prev    next >
Text File  |  1995-03-20  |  9KB  |  357 lines

  1. /******************************************************************************
  2.  *    DCfile.c:    ファイル読み込み処理
  3.  ******************************************************************************
  4.  *
  5.  *
  6.  */
  7. #include <stdio.h>
  8. #include <ctype.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <stat.h>
  12. #include <io.h>
  13. #include <jfctype.h>
  14. #include <doslib.h>
  15. #include <event.h>        /* イベントマンを利用するときに必要    */
  16. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  17. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  18. #include <control.h>        /* コントロールマンを利用するときに必要    */
  19. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  20. #include <task.h>        /* タスクマンを利用するときに必要    */
  21. #include "DC.h"            /* このプログラム固有のヘッダファイル    */
  22.  
  23. /******************************************************************************
  24.  *    GetData():    データ読み込み
  25.  ******************************************************************************
  26.  *    引数:    ComVal *pcv    共通変数へのポインタ
  27.  *        char *pname    ファイル名(フルパス)
  28.  */
  29. int GetData(ComVal *pcv, char *pname)
  30. {
  31.     FILE *fn;
  32.     int i,cutOk;
  33.     long fileLen, line;
  34.     char *data;
  35.     void **dmy1;
  36.  
  37.     fn = fopen(pname, "rb");
  38.     if (fn == NULL) {
  39.         pcv->errorCode = -2;
  40.         DMError(D_CONFIRM,"ファイルが見つかりません");
  41.         return(0);
  42.     }
  43.  
  44.     fseek(fn, -1, SEEK_END);
  45.     fileLen = ftell(fn);        /* ファイルサイズを求める    */
  46.     fseek(fn, 0, SEEK_SET);
  47.  
  48.  
  49.     dmy1 = NULL;
  50.     dmy1 = MMChHdlNew((fileLen*3)/2 + 64);
  51.  
  52.     if (dmy1 == NULL) {        /* メモリが確保できる?        */
  53.         DMError(D_CONFIRM | D_RED, "メモリが確保できません");
  54.         fclose(fn);
  55.         return(0);
  56.     }
  57.     MMHdlDispose(dmy1);
  58.  
  59.     EMEnCross();        /* マウスポインタアニメーション開始    */
  60.  
  61.     if (pcv->loadFlag) {
  62.         GMDisposeRgn(pcv->updateRgnHdl);
  63.         MMHdlDispose(pcv->txt);
  64.         MMHdlDispose(pcv->txtNo);
  65.     }
  66.  
  67.     pcv->updateRgnHdl = GMNewRgn();
  68.  
  69.     pcv->txt = MMChHdlNew(fileLen);        /* テキストメモリ確保    */
  70.     line = fileLen / 2;
  71.     pcv->txtNo = MMChHdlNew(line + 64);    /* 行ポインタ確保    */
  72.  
  73.     MMHdlLock(pcv->txt);
  74.     fread(*(pcv->txt), sizeof(char), (size_t) (fileLen), fn);
  75.     MMHdlUnlock(pcv->txt);
  76.  
  77.     fclose(fn);
  78.  
  79.     dispoBits(pcv);
  80.     pcv->loadFlag = 1;
  81.     pcv->file_size = fileLen;
  82.     pcv->status = 0;
  83.     strcpy(pcv->currentFname, pname);
  84.     chkdrv(pcv);            /* ドライブパスのチェック    */
  85.     setWinOpt(pcv);            /* ウィンドウオプション設定    */
  86.     cutOk = processText(pcv);    /* テキストの整理        */
  87.     CMMaxSet(pcv->volHdl, pcv->Maxline - 29);
  88.     EMDeCross();            /* マウスポインタをもとに戻す    */
  89.     if (!cutOk && pcv->cutDisp)
  90.         DMError(D_CONFIRM,
  91.         "一部あるいは全部の\rCUTファイルの読み込みに失敗しました");
  92.     return(1);
  93. }
  94.  
  95. /******************************************************************************
  96.  *    processText():    テキストの整理
  97.  ******************************************************************************
  98.  *    引数:    ComVal *pcv    共通変数へのポインタ
  99.  */
  100. int processText(ComVal *pcv)
  101. {
  102.     int i,ii,jj,j,k,tb,vw,line_end,pat1,pat2,esc,cut_lno,cutOk;
  103.     int word_count,line_count,txt_end;
  104.     char cutfname[90];
  105.     char dmyfname[90];
  106.     char buff[90];
  107.     char *txtPt,*txtTop,*txtBuf;
  108.     int *txtNo;
  109.     Rect rc = { 0, 0, 588, 382};
  110.     char drv[90], path[90], node[90], ext[90];
  111.  
  112.     MMHdlLock(pcv->txt);        /* テキストブロックのハンドルをロック */
  113.     MMHdlLock(pcv->txtNo);
  114.  
  115.     txtPt = *(pcv->txt);
  116.     txtNo = *(pcv->txtNo);
  117.     txtTop = txtPt;
  118.  
  119.     line_count = 0;
  120.     *txtNo = 0;
  121.     if (pcv->cutDisp) {
  122.         cutOk = 1;
  123.     } else {
  124.         cutOk = 0;
  125.     }
  126.     while(1) {
  127.         j = 0;
  128.         jj = 0;
  129.         vw = 0;
  130.         *(txtNo + line_count) = txtPt - txtTop;
  131.         txt_end = 0;
  132.         while(1) {
  133.             if (*txtPt == 26) {            /* EOF        */
  134.                 *txtPt = 0;
  135.                 txt_end = 1;
  136.                 break;
  137.             }
  138.  
  139.             if (*txtPt == 9) {            /* TAB処理    */
  140.                 tb = 8 - (jj % 8);
  141.                 j = 0;
  142.                 jj = jj + tb;
  143.                 txtPt++;
  144.                 continue;
  145.             }
  146.  
  147.             if (*txtPt == 13) {            /* 改行処理    */
  148.                 txtPt++;
  149.                 break;
  150.             }
  151.  
  152.             if (*txtPt == 10) {            /* LF処理    */
  153.                 *(txtNo + line_count) = *(txtNo + line_count) + 1;
  154.                 txtPt++;
  155.                 continue;
  156.             }
  157.  
  158.             if (jj == 94){                /* 行の折り返し    */
  159.                 pat1 =((int)*txtPt << 8) + (int)*(txtPt+1);
  160.                 if (jiszen(pat1) && (*(txtPt + 2) == 13)) {
  161.                     txtPt = txtPt + 3;
  162.                     break;
  163.                 }
  164.                 pat2 =((int)*(txtPt-1) << 8) + (int)*txtPt;
  165.                 if (jiszen(pat2) && (!jiszen(pat1))) {
  166.                     txtPt++;
  167.                     if (*txtPt == 13) txtPt++;
  168.                     break;
  169.                 }
  170.             }
  171.             if (*txtPt ==  '%') {            /* %コード処理    */
  172.                 if (*(txtPt + 1) == 'V') {    /* 倍角設定    */
  173.                     vw = 1;
  174.                     txtPt = txtPt + 4;
  175.                     j = 0;
  176.                     continue;
  177.                 }
  178.                 if ((*(txtPt + 1) == 'C' && cutOk && pcv->cutNo < 30)) {
  179.                     if (*(txtPt + 4) == ':') {    /* カットファイル*/
  180.                         txtBuf = txtPt;
  181.                         cut_lno = '0';
  182.                         *(txtPt+2) = '0'+(char)pcv->cutNo;
  183.                         *(txtPt+3) = cut_lno;
  184.                         txtPt = txtPt + 5;
  185.                         while(!(isalnmkana((int)*txtPt)) && *txtPt != '\\') {
  186.                             txtPt++;
  187.                         }
  188.                         for(i=0;i<90;i++) {
  189.                             if (*txtPt == '.')
  190.                                 break;
  191.                             dmyfname[i] = *txtPt++;
  192.                         }
  193.                         for(ii=i;ii<i+4;ii++) {
  194.                             dmyfname[ii] = *txtPt++;
  195.                         }
  196.                             dmyfname[ii] = 0;
  197.  
  198.                         if (*dmyfname == '\\') {
  199.                             if (!strncmp(pcv->currentFname,pcv->a_drv, strlen(pcv->a_drv)))
  200.                                 sprintf(buff, "A:%s", dmyfname);
  201.                             else
  202.                                 sprintf(buff, "B:%s", dmyfname);
  203.             
  204.                             structfname(pcv, "", buff, cutfname);
  205.                         } else {
  206.                             strsfn(pcv->currentFname, drv, path, node, ext);
  207.                             sprintf(cutfname, "%s%s\\%s", drv, path,dmyfname);
  208.                         }
  209.  
  210.                         if (!cut(pcv, cutfname)) {
  211.                             cutOk = 0;
  212.                             txtPt = txtBuf;
  213.                             *(txtPt+2) = 'U';
  214.                             *(txtPt+3) = 'T';
  215.                         } else {
  216.                             continue;
  217.                             cutOk = 1;
  218.                         }
  219.                     } else if (cutOk) {
  220.                         *(txtPt+2) = '0' + (char)pcv->cutNo - 1;
  221.                         *(txtPt+3) = ++cut_lno;
  222.                     }
  223.                 }
  224.             }
  225.  
  226.             if (*txtPt ==  24) {            /* 倍角解除    */
  227.                 if (vw == 1) {
  228.                     vw = 0;
  229.                     j = 0;
  230.                     continue;
  231.                 }
  232.                 txtPt++;
  233.                 continue;
  234.             }
  235.  
  236.             if (*txtPt ==  27) {            /* esc文字属性    */
  237.                 if (*(txtPt+1) == '[') {
  238.                     esc = 0;
  239.                     txtPt = txtPt + 2;
  240.                     while(*txtPt != 'm') {
  241.                         txtPt++;
  242.                     }
  243.                     txtPt++;
  244.                     continue;
  245.                 }
  246.             }
  247.  
  248.             if (jj>=94) {
  249.                 break;
  250.             }
  251.  
  252.             txtPt++;
  253.             jj++;
  254.         }
  255.         if (txt_end) break;
  256.         if ((txtPt - txtTop + 1) >= pcv->file_size) break;
  257.         line_count++;
  258.     }
  259.     pcv->Maxline = line_count;
  260.     pcv->ofset = 0;
  261.     MMHdlUnlock(pcv->txtNo); /* テキストブロックのハンドルをアンロック */
  262.     MMHdlUnlock(pcv->txt);
  263.     return(cutOk);
  264. }
  265.  
  266. /******************************************************************************
  267.  *    setWinOpt():    ウィンドウ設定
  268.  ******************************************************************************
  269.  *    引数:    ComVal *pcv    共通変数へのポインタ
  270.  */
  271. void setWinOpt(ComVal *pcv)
  272. {
  273.     LASCII wTitle;
  274.     char name[90],node[90],ext[5];
  275.     Task mytask;
  276.     size_t len;
  277.     char *txtPt,*ttPt,*tePt;
  278.  
  279.     strcpy(name, pcv->currentFname);
  280.     stcgfn(node, name);
  281.     if (strcmp(node, "MOKUJI") == 0) {
  282.         MMHdlLock(pcv->txt);
  283.         txtPt = *(pcv->txt);
  284.         ttPt = strstr(txtPt, "電脳倶楽部 ");
  285.         MMHdlUnlock(pcv->txt);
  286.         tePt = strstr(ttPt, "(");
  287.         strncpy(pcv->title, ttPt, tePt - ttPt);
  288.         pcv->title[tePt - ttPt] = 0;
  289.     }
  290.  
  291.     len = strlen(pcv->currentFname);
  292.  
  293.     /* ファイル名の変更があったのでタスク管理レコードに設定
  294.        (タスク起動チェックに必要)*/
  295.     TSGetTdb(&mytask, TS_OWN);
  296.     mytask.command[0] = len;
  297.     strncpy((char *) &mytask.command[1], pcv->currentFname, len);
  298.     TSSetTdb(&mytask, TS_OWN);
  299.  
  300.     stcgfn(name, pcv->currentFname);
  301.     stcgfe(ext, pcv->currentFname);
  302.     wTitle[0] = sprintf((char *) &wTitle[1], "%s [%s.%s]",pcv->title,name,ext);
  303.     WMTitleSet(pcv->windowPtr, wTitle);
  304. }
  305.  
  306. /******************************************************************************
  307.  *    chkdrv():    ドライブパス設定
  308.  ******************************************************************************
  309.  *    引数:    ComVal *pcv    共通変数へのポインタ
  310.  */
  311. void chkdrv(ComVal *pcv)
  312. {
  313.     char name[256], node[256], try_a[236], drv[90], path[90], ext[5];
  314.     int i, pat = 0;
  315.  
  316.  
  317.     strcpy(name, pcv->currentFname);
  318.     stcgfn(node, name);
  319.     if (strncmp(node, "MOKUJI", 6))
  320.         return;
  321.  
  322.     pcv->mloadFlag = 0;
  323.  
  324.     for(i=0;i<strlen(name);i++) { /* 仮想A:ドライブパス設定        */
  325.         if (!strncmp(strupr(&name[i]), "QS", 2) ||
  326.             !strncmp(strupr(&name[i]), "QUICKSTART", 2)) {
  327.             pat = 1;
  328.             break;
  329.         }
  330.     }
  331.     if (!pat)
  332.         return;
  333.  
  334.     strsfn(pcv->currentFname, drv, path, node, ext); /* カレントパス設定 */
  335.     sprintf(pcv->currentPath, "%s%s\\", drv, path);
  336.  
  337.     strncpy(try_a, name, i - 1); /* 仮想B:ドライブパス設定        */
  338.     try_a[i-1] = 0;
  339.     strcpy(pcv->a_drv, try_a);
  340.  
  341.     if (try_a[2] != '\\') {
  342.         try_a[0] = try_a[0] + 1;
  343.         strcpy(pcv->b_drv, try_a);
  344.         return;
  345.     }
  346.  
  347.     if (try_a[i-2] == '1') {
  348.         try_a[i-2] = '2';
  349.     } else if ((try_a[i-2] == 'a') || (try_a[i-2] == 'A')) {
  350.         try_a[i-2] = 'B';
  351.     } else {
  352.         return;
  353.     }
  354.     strcpy(pcv->b_drv, try_a);
  355.  
  356. }STR@"ロEdEV3.00<@(!%G0JHH     
  357. ハRRT'オヨH vケ > >Ohh$000ヨ=4